#include "common.h"

class UdpClient 
{
  public:
    // 构造函数，需要显示传入目的服务器的IP地址和端口号，作为数据发送的目的地
    UdpClient(const string& serverIp, const int serverPort)
      :_sockfd(-1)
      ,_serverIp(serverIp)
      ,_serverPort(serverPort)
    {}

    // 析构函数，关闭打开的socket文件描述符
    ~UdpClient()
    {
      if(_sockfd >= 0)
      {
        close(_sockfd);
      }
    }

    // 初始化客户端，只需要创建客户端网络进程的socket文件描述符即可
    void InitUdpClient()
    {
      if((_sockfd=socket(AF_INET, SOCK_DGRAM, 0)) == -1)
      {
        cerr<<"socket error"<<endl;
        return;
      }
    }

    // 开始执行客户端功能
    void Start()
    {
      string msg;
	  // 在struct sockaddr_in结构中填入服务器的协议地址
      struct sockaddr_in peer;
      peer.sin_family = AF_INET;
      peer.sin_port = htons(_serverPort);
      peer.sin_addr.s_addr = inet_addr(_serverIp.c_str());

      // 通过sendto函数发送数据到服务器
      while(true)
      {
        cout<<"Please Enter# ";
        getline(cin, msg);
        sendto(_sockfd, msg.c_str(), msg.size(), 0, (struct sockaddr*)&peer, sizeof(struct sockaddr));
      }
    }

  private:
    int _sockfd;     // 客户端进程的socket文件描述符
    string _serverIp;// 服务器进程的IP地址
    int _serverPort; // 服务器进程的端口号
};
